// 这是一个测试管道的c语言程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>



int main()
{
  // 1. 父进程创建管道
  int fd[2] = {0};

  if (pipe(fd) == -1)
  {
    // -1表示创建失败
    perror("pipe error!\n");
    exit(-1);
  }

  // 2. 父进程创建子进程
  pid_t pid = fork();
  if (pid == 0)
  {
    // child
    // 3. child write
    close(fd[0]); // 关闭读端

    // 4. send message
    const char* msg = "hello! im child!\n";
    int count = 5;
    while(count--)
    {
      write(fd[1] , msg , strlen(msg));
      // 这里我们不需要把/0 拷贝到文件中因为这只是c语言字符串的规则
      sleep(2);
    }
    close(fd[1]);
    exit(0);
  }
  

  close(fd[1]);
  // father
  // 3. father read 
  // 关闭写端
  // 4. read message
  char buff[64] = {0}; 
  while (1)
  {
    ssize_t s = read(fd[0] , buff , sizeof(buff));
    if (s == 0)
    {
      // 写文件关闭了
      printf("write file close\n");
      break;
    }
    else if (s > 0)
    {
      printf("child say: %s",buff);
    }
    else 
    {
      printf("error!\n");
      break;
    }
  }
  close(fd[0]);
  waitpid(-1 , NULL , 0);
  printf("wait child process success!\n");
  return 0;
}
